home *** CD-ROM | disk | FTP | other *** search
/ Freelog 115 / FreelogNo115-MaiJuin2013.iso / Internet / Filezilla Server / FileZilla_Server-0_9_41.exe / source / interface / GroupsDlg.cpp < prev    next >
C/C++ Source or Header  |  2011-11-06  |  14KB  |  559 lines

  1. // FileZilla Server - a Windows ftp server
  2.  
  3. // Copyright (C) 2002-2004 - Tim Kosse <tim.kosse@gmx.de>
  4.  
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9.  
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14.  
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software
  17. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. // GroupsDlg.cpp: Implementierungsdatei
  20. //
  21.  
  22. #include "stdafx.h"
  23. #include "FileZilla server.h"
  24. #include "GroupsDlg.h"
  25. #include "misc\sbdestination.h"
  26. #include "entersomething.h"
  27. #include "GroupsDlgGeneral.h"
  28. #include "GroupsDlgSpeedLimit.h"
  29. #include "GroupsDlgSharedFolders.h"
  30. #include "GroupsDlgIpFilter.h"
  31. #include "DeleteGroupInUseDlg.h"
  32.  
  33. #if defined(_DEBUG) && !defined(MMGR)
  34. #define new DEBUG_NEW
  35. #undef THIS_FILE
  36. static char THIS_FILE[] = __FILE__;
  37. #endif
  38.  
  39. /////////////////////////////////////////////////////////////////////////////
  40. // Dialogfeld CGroupsDlg 
  41.  
  42. CGroupsDlg::CGroupsDlg(CWnd* pParent, bool localConnection)
  43.     : CSAPrefsDialog(CGroupsDlg::IDD, pParent)
  44. {
  45.     m_localConnection = localConnection;
  46.     m_insideSelchange = false;
  47.  
  48.     m_pGeneralPage = new CGroupsDlgGeneral(this);
  49.     m_pSpeedLimitPage = new CGroupsDlgSpeedLimit(this);
  50.     m_pSharedFoldersPage = new CGroupsDlgSharedFolders(this);
  51.     m_pIpFilterPage = new CGroupsDlgIpFilter(this);
  52.     
  53.     AddPage(*m_pGeneralPage, _T("General"));
  54.     AddPage(*m_pSharedFoldersPage, _T("Shared folders"));
  55.     AddPage(*m_pSpeedLimitPage, _T("Speed Limits"));
  56.     AddPage(*m_pIpFilterPage, _T("IP Filter"));
  57. }
  58.  
  59. CGroupsDlg::~CGroupsDlg()
  60. {
  61.     delete m_pGeneralPage;
  62.     delete m_pSpeedLimitPage;
  63.     delete m_pSharedFoldersPage;
  64.     delete m_pIpFilterPage;
  65. }
  66.  
  67. void CGroupsDlg::DoDataExchange(CDataExchange* pDX)
  68. {
  69.     CSAPrefsDialog::DoDataExchange(pDX);
  70.     //{{AFX_DATA_MAP(CGroupsDlg)
  71.     DDX_Control(pDX, IDC_GROUPS_GROUPLIST, m_cGrouplist);
  72.     //}}AFX_DATA_MAP
  73. }
  74.  
  75. BEGIN_MESSAGE_MAP(CGroupsDlg, CSAPrefsDialog)
  76.     //{{AFX_MSG_MAP(CGroupsDlg)
  77.     ON_LBN_SELCHANGE(IDC_GROUPS_GROUPLIST, OnSelchangeGrouplist)
  78.     ON_WM_CONTEXTMENU()
  79.     ON_COMMAND(ID_GROUPMENU_ADD, OnGroupAdd)
  80.     ON_COMMAND(ID_GROUPMENU_COPY, OnGroupCopy)
  81.     ON_COMMAND(ID_GROUPMENU_REMOVE, OnGroupRemove)
  82.     ON_COMMAND(ID_GROUPMENU_RENAME, OnGroupRename)
  83.     ON_BN_CLICKED(IDC_GROUPS_ADDGROUP, OnGroupAdd)
  84.     ON_BN_CLICKED(IDC_GROUPS_COPYGROUP, OnGroupCopy)
  85.     ON_BN_CLICKED(IDC_GROUPS_REMOVEGROUP, OnGroupRemove)
  86.     ON_BN_CLICKED(IDC_GROUPS_RENAMEGROUP, OnGroupRename)
  87.     //}}AFX_MSG_MAP
  88. END_MESSAGE_MAP()
  89.  
  90. /////////////////////////////////////////////////////////////////////////////
  91. // Behandlungsroutinen fⁿr Nachrichten CGroupsDlg 
  92.  
  93. BOOL CGroupsDlg::OnInitDialog() 
  94. {
  95.     CSAPrefsDialog::OnInitDialog();
  96.     
  97.     m_oldgroup = LB_ERR;
  98.     m_cGrouplist.ResetContent();    
  99.     UpdateData(FALSE);
  100.     for (unsigned int i = 0; i < m_GroupsList.size(); i++)
  101.     {
  102.         int index = m_cGrouplist.AddString(m_GroupsList[i].group);
  103.         m_cGrouplist.SetItemData(index, i);
  104.     }
  105.                 
  106.     if (m_GroupsList.size())
  107.     {
  108.         m_cGrouplist.SetCurSel(0);
  109.         OnSelchangeGrouplist();
  110.     }
  111.  
  112.     SetCtrlState();
  113.  
  114.     return TRUE;  // return TRUE unless you set the focus to a control
  115.                   // EXCEPTION: OCX-Propertypages should return FALSE
  116. }
  117.  
  118. BOOL CGroupsDlg::Validate()
  119. {
  120.     CString res = m_pGeneralPage->Validate();
  121.     if (res != _T(""))
  122.     {
  123.         ShowPage(m_pGeneralPage);
  124.         m_cGrouplist.SetCurSel(m_oldgroup);
  125.         MessageBox(res);
  126.         return FALSE;
  127.     }
  128.     res = m_pSpeedLimitPage->Validate();
  129.     if (res != _T(""))
  130.     {
  131.         ShowPage(m_pSpeedLimitPage);
  132.         m_cGrouplist.SetCurSel(m_oldgroup);
  133.         MessageBox(res);
  134.         return FALSE;
  135.     }
  136.     res = m_pSharedFoldersPage->Validate();
  137.     if (res != _T(""))
  138.     {
  139.         ShowPage(m_pSharedFoldersPage);
  140.         m_cGrouplist.SetCurSel(m_oldgroup);
  141.         MessageBox(res);
  142.         return FALSE;
  143.     }        
  144.     res = m_pIpFilterPage->Validate();
  145.     if (res != _T(""))
  146.     {
  147.         ShowPage(m_pIpFilterPage);
  148.         m_cGrouplist.SetCurSel(m_oldgroup);
  149.         MessageBox(res);
  150.         return FALSE;
  151.     }    
  152.     return TRUE;
  153. }
  154.  
  155. void CGroupsDlg::OnSelchangeGrouplist() 
  156. {
  157.     m_insideSelchange = true;
  158.     if (!Validate())
  159.     {
  160.         m_insideSelchange = false;
  161.         return;
  162.     }
  163.     m_insideSelchange = false;
  164.     if (m_oldgroup != LB_ERR)
  165.     {
  166.         int oldindex = m_cGrouplist.GetItemData(m_oldgroup);
  167.         VERIFY(m_pGeneralPage->SaveGroup(&m_GroupsList[oldindex]));
  168.         VERIFY(m_pSpeedLimitPage->SaveGroup(&m_GroupsList[oldindex]));
  169.         VERIFY(m_pSharedFoldersPage->SaveGroup(&m_GroupsList[oldindex]));
  170.         VERIFY(m_pIpFilterPage->SaveGroup(&m_GroupsList[oldindex]));
  171.     }
  172.     int nItem = m_cGrouplist.GetCurSel();
  173.     if (nItem != LB_ERR)
  174.     {
  175.         m_oldgroup = nItem;
  176.         int index = m_cGrouplist.GetItemData(nItem);
  177.         VERIFY(m_pGeneralPage->DisplayGroup(&m_GroupsList[index]));
  178.         VERIFY(m_pSpeedLimitPage->DisplayGroup(&m_GroupsList[index]));
  179.         VERIFY(m_pSharedFoldersPage->DisplayGroup(&m_GroupsList[index]));
  180.         VERIFY(m_pIpFilterPage->DisplayGroup(&m_GroupsList[index]));
  181.     }
  182.     else
  183.     {
  184.         VERIFY(m_pGeneralPage->DisplayGroup(NULL));
  185.         VERIFY(m_pSpeedLimitPage->DisplayGroup(NULL));
  186.         VERIFY(m_pSharedFoldersPage->DisplayGroup(NULL));
  187.         VERIFY(m_pIpFilterPage->DisplayGroup(NULL));
  188.     }
  189.  
  190.     SetCtrlState();
  191. }
  192.  
  193. void CGroupsDlg::OnOK() 
  194. {
  195.     if (!Validate())
  196.         return;
  197.     m_cGrouplist.SetCurSel(-1);
  198.     OnSelchangeGrouplist();
  199.     
  200.     CSAPrefsDialog::OnOK();
  201. }
  202.  
  203. void CGroupsDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
  204. {
  205.     if (pWnd==&m_cGrouplist)
  206.     {
  207.         CMenu menu;
  208.         menu.LoadMenu(IDR_GROUPCONTEXT);
  209.  
  210.         CMenu* pPopup = menu.GetSubMenu(0);
  211.         ASSERT(pPopup != NULL);
  212.         CWnd* pWndPopupOwner = this;
  213.         while (pWndPopupOwner->GetStyle() & WS_CHILD)
  214.             pWndPopupOwner = pWndPopupOwner->GetParent();
  215.         
  216.         if (m_cGrouplist.GetCurSel()==LB_ERR)
  217.         {
  218.             pPopup->EnableMenuItem(ID_GROUPMENU_COPY, MF_GRAYED);
  219.             pPopup->EnableMenuItem(ID_GROUPMENU_REMOVE, MF_GRAYED);
  220.             pPopup->EnableMenuItem(ID_GROUPMENU_RENAME, MF_GRAYED);
  221.         }
  222.         if (point.x==-1)
  223.             GetCursorPos(&point);
  224.         pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
  225.             pWndPopupOwner);
  226.     }
  227. }
  228.  
  229. void CGroupsDlg::OnGroupAdd() 
  230. {
  231.     if (!Validate())
  232.         return;
  233.  
  234.     CEnterSomething dlg(IDS_ADDGROUPDIALOG);
  235.     if (dlg.DoModal()==IDOK)
  236.     {
  237.         CString newname=dlg.m_String;
  238.         newname.MakeLower();
  239.         for (int i=0; i<m_cGrouplist.GetCount(); i++)
  240.         {
  241.             CString str;
  242.             m_cGrouplist.GetText(i, str);
  243.             str.MakeLower();
  244.             if (str==newname)
  245.             {
  246.                 AfxMessageBox(IDS_ERRORMSG_GROUPALREADYEXISTS);
  247.                 return;
  248.             }
  249.         }
  250.  
  251.         t_group group;
  252.         group.group = dlg.m_String;
  253.         group.nBypassUserLimit = 0;
  254.         group.nIpLimit = 0;
  255.         group.nUserLimit = 0;
  256.         group.forceSsl = 0;
  257.         int nItem = m_cGrouplist.AddString(group.group);
  258.         if (nItem <= m_oldgroup)
  259.             m_oldgroup++;
  260.         m_GroupsList.push_back(group);
  261.         m_cGrouplist.SetItemData(nItem, m_GroupsList.size()-1);
  262.         m_cGrouplist.SetCurSel(nItem);    
  263.         OnSelchangeGrouplist();
  264.     }
  265. }
  266.  
  267. void CGroupsDlg::OnGroupCopy() 
  268. {
  269.     if (!Validate())
  270.         return;
  271.  
  272.     int pos = m_cGrouplist.GetCurSel();
  273.     if (pos==LB_ERR)
  274.         return;
  275.     int index = m_cGrouplist.GetItemData(pos);
  276.  
  277.     CEnterSomething dlg(IDS_COPYGROUPDIALOG);
  278.     if (dlg.DoModal()==IDOK)
  279.     {
  280.         int i;
  281.         CString newname = dlg.m_String;
  282.         newname.MakeLower();
  283.         for (i=0;i<m_cGrouplist.GetCount();i++)
  284.         {
  285.             CString str;
  286.             m_cGrouplist.GetText(i,str);
  287.             str.MakeLower();
  288.             if (str==newname)
  289.             {
  290.                 AfxMessageBox(IDS_ERRORMSG_GROUPALREADYEXISTS);
  291.                 return;
  292.             }
  293.         }
  294.         
  295.         t_group group = m_GroupsList[index];
  296.         group.group = dlg.m_String;
  297.         
  298.         int nItem = m_cGrouplist.AddString(group.group);
  299.         if (nItem <= m_oldgroup)
  300.             m_oldgroup++;
  301.         m_GroupsList.push_back(group);
  302.         m_cGrouplist.SetItemData(nItem, m_GroupsList.size()-1);
  303.         m_cGrouplist.SetCurSel(nItem);    
  304.  
  305.         OnSelchangeGrouplist();
  306.     }    
  307. }
  308.  
  309.  
  310. void CGroupsDlg::OnGroupRemove() 
  311. {
  312.     int pos = m_cGrouplist.GetCurSel();
  313.     if (pos == LB_ERR)
  314.         return;
  315.     int index = m_cGrouplist.GetItemData(pos);
  316.     m_oldgroup = LB_ERR;
  317.     
  318.     unsigned int i = 0;
  319.     CString oldName;
  320.     m_cGrouplist.GetText(pos, oldName);
  321.     for (i = 0; i < m_UsersList.size(); i++)
  322.     {
  323.         if (!m_UsersList[i].group.CompareNoCase(oldName))
  324.         {
  325.             CDeleteGroupInUseDlg dlg;
  326.             dlg.m_groupName = oldName;
  327.             dlg.m_GroupsList = &m_GroupsList;
  328.             if (dlg.DoModal() != IDOK)
  329.                 return;
  330.  
  331.             if (!dlg.m_action)
  332.             {
  333.                 for (unsigned int k = 0; k < m_UsersList.size(); k++)
  334.                 {
  335.                     t_user& user = m_UsersList[k];
  336.                     if (user.group.CompareNoCase(oldName))
  337.                         continue;
  338.                     user.group = dlg.m_groupName;
  339.                 }
  340.             }
  341.             else
  342.             {
  343.                 // Delete affected users
  344.                 t_UsersList newList;
  345.                 for (unsigned int k = 0; k < m_UsersList.size(); k++)
  346.                 {
  347.                     if (m_UsersList[k].group.CompareNoCase(oldName))
  348.                         newList.push_back(m_UsersList[k]);
  349.                 }
  350.                 m_UsersList = newList;
  351.             }
  352.         }
  353.     }
  354.     
  355.     i = 0;
  356.     for (t_GroupsList::iterator iter = m_GroupsList.begin(); iter != m_GroupsList.end(); iter++, i++)
  357.         if (i == index)
  358.         {
  359.             m_GroupsList.erase(iter);
  360.             break;
  361.         }
  362.     for (i = 0; i < (unsigned int)m_cGrouplist.GetCount(); i++)
  363.     {
  364.         int data = m_cGrouplist.GetItemData(i);
  365.         if (data > index)
  366.             m_cGrouplist.SetItemData(i, data-1);
  367.     }
  368.     m_cGrouplist.DeleteString(pos);
  369.     OnSelchangeGrouplist();
  370. }
  371.  
  372. void CGroupsDlg::OnGroupRename() 
  373. {
  374.     if (!Validate())
  375.         return;
  376.  
  377.     int pos=m_cGrouplist.GetCurSel();
  378.     if (pos==LB_ERR)
  379.         return;
  380.     int index=m_cGrouplist.GetItemData(pos);
  381.  
  382.     CEnterSomething dlg(IDS_INPUTDIALOGTEXT_RENAME);
  383.     if (dlg.DoModal()==IDOK)
  384.     {
  385.         CString newname=dlg.m_String;
  386.         newname.MakeLower();
  387.         for (int i = 0; i < m_cGrouplist.GetCount(); i++)
  388.         {
  389.             if (i == pos)
  390.                 continue;
  391.  
  392.             CString str;
  393.             m_cGrouplist.GetText(i, str);
  394.             str.MakeLower();
  395.             if (str == newname)
  396.             {
  397.                 AfxMessageBox(IDS_ERRORMSG_GROUPALREADYEXISTS);
  398.                 return;
  399.             }
  400.         }
  401.         
  402.         CString oldName;
  403.         m_cGrouplist.GetText(pos, oldName);
  404.         m_cGrouplist.DeleteString(pos);
  405.         pos = m_cGrouplist.AddString(dlg.m_String);
  406.         m_cGrouplist.SetItemData(pos,index);
  407.         m_cGrouplist.SetCurSel(pos);    
  408.         m_oldgroup = pos;
  409.         m_GroupsList[index].group = dlg.m_String;
  410.  
  411.         for (unsigned int i = 0; i < m_UsersList.size(); i++)
  412.         {
  413.             if (!m_UsersList[i].group.CompareNoCase(oldName))
  414.                 m_UsersList[i].group = dlg.m_String;
  415.         }
  416.  
  417.         OnSelchangeGrouplist();
  418.     }
  419. }
  420.  
  421. void CGroupsDlg::SetCtrlState()
  422. {
  423.     if (m_cGrouplist.GetCurSel() == LB_ERR)
  424.     {
  425.         GetDlgItem(IDC_GROUPS_REMOVEGROUP)->EnableWindow(FALSE);
  426.         GetDlgItem(IDC_GROUPS_RENAMEGROUP)->EnableWindow(FALSE);
  427.         GetDlgItem(IDC_GROUPS_COPYGROUP)->EnableWindow(FALSE);
  428.     }
  429.     else
  430.     {
  431.         GetDlgItem(IDC_GROUPS_REMOVEGROUP)->EnableWindow(TRUE);
  432.         GetDlgItem(IDC_GROUPS_RENAMEGROUP)->EnableWindow(TRUE);
  433.         GetDlgItem(IDC_GROUPS_COPYGROUP)->EnableWindow(TRUE);    
  434.     }
  435.     m_pGeneralPage->SetCtrlState();
  436.     m_pSpeedLimitPage->SetCtrlState();
  437.     m_pSharedFoldersPage->SetCtrlState();
  438.     m_pIpFilterPage->SetCtrlState();
  439. }
  440.  
  441. BOOL CGroupsDlg::GetAsCommand(char **pBuffer, DWORD *nBufferLength)
  442. {
  443.     if (!pBuffer)
  444.         return FALSE;
  445.  
  446.     DWORD len = 4;
  447.  
  448.     t_GroupsList::iterator groupiter;
  449.     for (groupiter=m_GroupsList.begin(); groupiter!=m_GroupsList.end(); groupiter++)
  450.         len += groupiter->GetRequiredBufferLen();
  451.  
  452.     t_UsersList::iterator iter;
  453.     for (iter=m_UsersList.begin(); iter!=m_UsersList.end(); iter++)
  454.         len += iter->GetRequiredBufferLen();
  455.  
  456.     *pBuffer=new char[len];
  457.     char *p=*pBuffer;
  458.  
  459.     *p++ = m_GroupsList.size()/256;
  460.     *p++ = m_GroupsList.size()%256;
  461.     for (groupiter=m_GroupsList.begin(); groupiter!=m_GroupsList.end(); groupiter++)
  462.     {
  463.         p = groupiter->FillBuffer(p);
  464.         if (!p)
  465.         {
  466.             delete [] *pBuffer;
  467.             *pBuffer = NULL;
  468.             return FALSE;
  469.         }        
  470.     }
  471.  
  472.     *p++ = m_UsersList.size()/256;
  473.     *p++ = m_UsersList.size()%256;
  474.     for (iter=m_UsersList.begin(); iter!=m_UsersList.end(); iter++)
  475.     {
  476.         p = iter->FillBuffer(p);
  477.         if (!p)
  478.         {
  479.             delete [] *pBuffer;
  480.             *pBuffer = NULL;
  481.             return FALSE;
  482.         }
  483.     }
  484.         
  485.     *nBufferLength = len;
  486.  
  487.     return TRUE;
  488. }
  489.  
  490. BOOL CGroupsDlg::Init(unsigned char *pData, DWORD dwDataLength)
  491. {
  492.     unsigned char *p=pData;
  493.     unsigned int i;
  494.  
  495.     if (dwDataLength < 2)
  496.         return FALSE;
  497.     unsigned int num = *p * 256 + p[1];
  498.     p+=2;
  499.     for (i=0; i<num; i++)
  500.     {
  501.         t_group group;
  502.         
  503.         p = group.ParseBuffer(p, dwDataLength-(p-pData));
  504.         if (!p)
  505.             return FALSE;
  506.         m_GroupsList.push_back(group);
  507.     }
  508.  
  509.     if ((UINT)(p-pData+2)>dwDataLength)
  510.         return FALSE;
  511.     num = *p * 256 + p[1];
  512.     p+=2;
  513.     for (i=0; i<num; i++)
  514.     {
  515.         t_user user;
  516.         
  517.         p = user.ParseBuffer(p, dwDataLength-(p-pData));
  518.         if (!p)
  519.             return FALSE;
  520.         m_UsersList.push_back(user);
  521.     }
  522.     return TRUE;
  523. }
  524.  
  525. BOOL CGroupsDlg::PreTranslateMessage(MSG* pMsg) 
  526. {
  527.     if (pMsg->message==WM_KEYDOWN)
  528.     {
  529.         if (pMsg->wParam==VK_F2)
  530.         {
  531.             if (GetFocus() == &m_cGrouplist)
  532.             {
  533.                 if (m_cGrouplist.GetCurSel() == LB_ERR)
  534.                     return TRUE;
  535.                 OnGroupRename();
  536.             }
  537.             return TRUE;
  538.         }
  539.     }
  540.     return CSAPrefsDialog::PreTranslateMessage(pMsg);
  541. }
  542.  
  543. t_group* CGroupsDlg::GetCurrentGroup()
  544. {
  545.     if (m_cGrouplist.GetCurSel() == LB_ERR)
  546.         return NULL;
  547.     else
  548.     {
  549.         if (m_insideSelchange)
  550.         {
  551.             if (m_oldgroup == LB_ERR)
  552.                 return NULL;
  553.             else
  554.                 return &m_GroupsList[m_cGrouplist.GetItemData(m_oldgroup)];
  555.         }
  556.         return &m_GroupsList[m_cGrouplist.GetItemData(m_cGrouplist.GetCurSel())];
  557.     }
  558. }
  559.